xcs_pidfile.close()
except:
return
+
+def start_xenstored():
+ if os.fork() == 0:
+ os.execvp('/usr/sbin/xenstored', ['/usr/sbin/xenstored']);
+
+def start_consoled():
+ if os.fork() == 0:
+ os.execvp('/usr/sbin/consoled', ['/usr/sbin/consoled']);
def main():
try:
return status >> 8
elif sys.argv[1] == 'start':
start_xcs()
- if os.fork() == 0:
- os.execvp('/usr/sbin/consoled', ['/usr/sbin/consoled']);
+ start_xenstored()
+ start_consoled()
return daemon.start()
elif sys.argv[1] == 'trace_start':
start_xcs()
+ start_xenstored()
+ start_consoled()
return daemon.start(trace=1)
elif sys.argv[1] == 'stop':
stop_xcs()
elif sys.argv[1] == 'restart':
stop_xcs()
start_xcs()
+ start_xenstored()
+ start_consoled()
return daemon.stop() or daemon.start()
elif sys.argv[1] == 'status':
return daemon.status()
def cleanup_xend(self, kill=False):
return self.cleanup_process(XEND_PID_FILE, "xend", kill)
- def cleanup_xenstored(self, kill=False):
- return self.cleanup_process(XENSTORED_PID_FILE, "xenstored", kill)
-
def cleanup(self, kill=False):
self.cleanup_xend(kill=kill)
- #self.cleanup_xenstored(kill=kill)
def status(self):
"""Returns the status of the xend daemon.
pidfile.close()
return pid
- def start_xenstored(self):
- """Fork and exec xenstored, writing its pid to XENSTORED_PID_FILE.
- """
- def mkdirs(p):
- try:
- os.makedirs(p)
- except:
- pass
- mkdirs(XENSTORED_RUN_DIR)
- mkdirs(XENSTORED_LIB_DIR)
-
- pid = self.fork_pid(XENSTORED_PID_FILE)
- if pid:
- # Parent
- log.info("Started xenstored, pid=%d", pid)
- else:
- # Child
- if XEND_DAEMONIZE:
- self.daemonize()
- if XENSTORED_DEBUG:
- os.execl("/usr/sbin/xenstored", "xenstored", "--no-fork",
- "-T", "/var/log/xenstored-trace.log")
- else:
- os.execl("/usr/sbin/xenstored", "xenstored", "--no-fork")
-
def daemonize(self):
if not XEND_DAEMONIZE: return
# Detach from TTY.
4 Insufficient privileges
"""
xend_pid = self.cleanup_xend()
- xenstored_pid = self.cleanup_xenstored()
if self.set_user():
return 4
os.chdir("/")
- if xenstored_pid == 0:
- self.start_xenstored()
-
if xend_pid > 0:
# Trying to run an already-running service is a success.
return 0
void daemonize(void)
{
pid_t pid;
+ int fd;
+ size_t len;
+ char buf[100];
/* Separate from our parent via fork, so init inherits us. */
if ((pid = fork()) < 0)
chdir("/");
/* Discard our parent's old-fashioned umask prejudices. */
umask(0);
+
+ fd = open("/var/run/xenstored.pid", O_RDWR | O_CREAT);
+ if (fd == -1) {
+ exit(1);
+ }
+
+ if (lockf(fd, F_TLOCK, 0) == -1) {
+ exit(1);
+ }
+
+ len = sprintf(buf, "%d\n", getpid());
+ write(fd, buf, len);
}